package com.example.springboot.controller.uploadFile.fragmentupload;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;

/**
 *
 * 分片上传关键是在前端对文件切片，比如一个 10MB 的文件切为 10 份，每份 1MB。每次上传的时候，需要多一个参数记录当前上传的文件切片的起始位置。
 * 比如一个 10MB 的文件，切为 10 份，每份 1MB，那么：
 *
 * 第 0 片，从 0 开始，一共是 1024*1024 个字节。
 * 第 1 片，从 1024*1024 开始，一共是 1024*1024 个字节。
 * 第 2 片..
 *
 *
 * @author chenzhangkun
 * @ClassName FragmentUploadController
 * @description: TODO
 * @date 2024年12月11日
 */
@RestController
@RequestMapping(value = "/file")
public class FragmentUploadController {
	private static final String UPLOAD_DIR = System.getProperty("user.home") + "/uploads/";

	@PostMapping("/upload2")
	public String resumeUpload(@RequestParam("file") MultipartFile file, @RequestParam("start") long start, @RequestParam("fileName") String fileName) {
		try {
			File directory = new File(UPLOAD_DIR);
			if (!directory.exists()) {
				directory.mkdirs();
			}
			File targetFile = new File(UPLOAD_DIR + fileName);
			RandomAccessFile randomAccessFile = new RandomAccessFile(targetFile, "rw");
			FileChannel channel = randomAccessFile.getChannel();
			// 后端每次处理的时候，需要先设置文件的起始位置。
			channel.position(start);
			channel.transferFrom(file.getResource().readableChannel(), start, file.getSize());
			channel.close();
			randomAccessFile.close();
			return "成功";
		} catch (Exception e) {
			System.out.println("上传失败: " + e.getMessage());
			return "失败";
		}

	}
}
